#define _CRT_SECURE_NO_WARNINGS 1
// /**
// *      author: Y_Yao
// *      created: 2024-10-18 18:48:14
// **/

// #include<bits/stdc++.h>

// #define int LL
// using namespace std;
// using LL = long long;
// const LL LLINF = 1e18;
// const int INF = 0x3f3f3f3f;
// const int N = 1e4 + 7;
// int f[N];
// int n,m,b;
// int l,r;

// void Dijkstra(int maxnum,vector<int>& dist,vector<vector<pair<int,int>>>& matrix)
// {
//     vector<bool> vis(n + 1,false);

//     dist[1] = 0;

//     priority_queue<pair<int,int>,vector<pair<int,int>>,greater<>> heap;
//     heap.push({0,1});
//     while(!heap.empty())
//     {
//         auto t = heap.top();
//         heap.pop();

//         int mini = t.second;
//         if(vis[mini]) continue;

//         vis[mini] = true;
//         for(auto e : matrix[mini])
//         {
//             if(f[e.second] > maxnum) continue;
//             if(dist[mini] + e.second < dist[e.first])
//             {
//                 dist[e.first] = dist[mini] + e.second;
//                 heap.push({dist[e.first],e.first});
//             }
//         }
//     } 
// }

// signed main()
// {
//     ios::sync_with_stdio(false);
//     cin.tie(0);

//     cin >> n >> m >> b;
//     for(int i = 1;i <= m;i++)
//     {
//         cin >> f[i];
//         r = max(r,f[i]);
//     }
//     l = max(f[1],f[n]);

//     vector<vector<pair<int,int>>> matrix(n + 1);
//     while(m--)
//     {
//         int a,b,c;
//         cin >> a >> b >> c;
//         matrix[a].push_back({b,c});
//         matrix[b].push_back({a,c});
//     }

//     vector<int> dist(n + 1,LLINF);

//     while(l < r)
//     {
//         int mid = (l + r) >> 1;
//         Dijkstra(mid,dist,matrix);
//         if(dist[n] > b)
//         {
//             l = mid + 1;
//         }
//         else r = mid;
//     }
//     Dijkstra(l,dist,matrix);


//     if(b < dist[n]) cout << "AFK" << endl;
//     else cout << l << endl;

//     return 0;
// }


#include <iostream>
#include <algorithm>
#include <cstring>
#include <queue>
#define int long long
using namespace std;
using PII = pair<int, int>;
const int N = 10010, M = 100010, MAXF = 1e9 + 5;

int n, m, b;
int h[N], e[M], ne[M], W[M], f[N], idx;
bool st[N];
long long dis[N];

void add(int a, int b, int w)
{
    e[idx] = b, ne[idx] = h[a], h[a] = idx, W[idx] = w, idx++;
}

int check(int x)
{
    if (x < f[1])
        return 0;
    for (int i = 1; i <= n; i++)
    {
        dis[i] = 1e9;
    }
    memset(st, 0, sizeof(st));
    dis[1] = 0;
    priority_queue<PII, vector<PII>, greater<PII>> heap;
    heap.push({ 0, 1 });
    while (!heap.empty())
    {
        PII t = heap.top();
        heap.pop();
        int ide = t.second, d = t.first;
        if (st[ide])
            continue;
        st[ide] = true;
        for (int i = h[ide]; i != -1; i = ne[i])
        {
            int j = e[i];
            if (f[j] <= x && dis[j] > d + W[i] && !st[j])
            {
                dis[j] = d + W[i];
                heap.push({ dis[j], j });
            }
        }
    }
    if (dis[n] <= b)
        return 1;
    else
        return 0;
}

signed main()
{
    memset(h, -1, sizeof h);
    cin >> n >> m >> b;
    for (int i = 1; i <= n; i++)
    {
        cin >> f[i];
    }

    for (int i = 0; i < m; i++)
    {
        int a, tmp, c;
        cin >> a >> tmp >> c;
        add(a, tmp, c);
        add(tmp, a, c);
    }

    if (check(MAXF) == 0)
    {
        cout << "AFK";
        return 0;
    }

    int l = 0, r = MAXF;
    while (l < r)
    {
        int mid = (l + r) >> 1;
        if (check(mid))
            r = mid;
        else
            l = mid + 1;
    }
    cout << l;
}